package org.example.atomictest;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author zhengdp
 * @Description 原子整数 测试
 * @Date 2022/11/19 21:28
 * @Created by zhengdp
 */
public class AtomicIntegerTest {
    public static void main(String[] args) {
        AtomicInteger i = new AtomicInteger(0);

        // 原子自增操作
        // 自增 并获取 （获取到自增后的值） ++i
        System.out.println("=========== incrementAndGet ============");
        System.out.println(i.incrementAndGet()); // 1
        System.out.println("========= getAndIncrement ===========");
        // 先获取再自增 i++ (原子性）
        System.out.println(i.getAndIncrement()); // 1
        System.out.println(i.get());
        // 增加值操作
        System.out.println("======== getAndAdd ============");
        System.out.println(i.getAndAdd(5)); // 2
        System.out.println(i.get());
        System.out.println("======== addAndGet ===========");
        System.out.println(i.addAndGet(5)); // 12

        // 复杂运算  传入运算方法
        System.out.println("======== updateAndGet ============");
        System.out.println(i.updateAndGet(pre -> {
            int next = pre *10;
            return next;
        }));
        // 模拟 updateAndGet方法实现
        System.out.println("========= 模拟 updateAndGet ===============");
        while(true) {
            int prex = i.get();
            int next = prex * 10;
            if(i.compareAndSet(prex,next)) {
                break;
            }
        }
        System.out.println(i.get());
    }
}
